<script>
    import config from '@/config'
    const wsUrl = config.wsUrl.dev;   // WeoSocket 服务器地址
    export default {
        name: 'header',
        data: {
            websock: null, // 建立的连接
            lockReconnect: false, // 是否真正建立连接
            timeout: 30 * 1000, // 30秒一次心跳
            timeoutObj: null, // 心跳心跳倒计时
            timeoutnum: null, // 断开 重连倒计时
        },
        created() {
            // 开启长连接
            init()
        },
        methods: {
            init() {
                // 建立连接
                this.websock = new WebSocket(wsUrl);
                // 连接成功
                this.websock.onopen = this.open;
                // 连接错误
                this.websock.onerror = this.error;
                // 接收信息
                this.websock.onmessage = this.message;
                // 关闭连接
                this.websock.onclose = this.close;
            },
            reconnect() { // 重新连接
                if (this.lockReconnect) {
                    return
                }
                this.lockReconnect = true
                // 设置延迟请求
                this.timeoutnum && clearTimeout(this.timeout)
                this.timeoutnum = setTimeout(() => {
                    this.init() // 重连
                    this.lockReconnect = false
                }, 3000)
            },
            reset() { // 重置心跳
                clearTimeout(this.timeoutObj) // 重置时间
                this.start() // 重启心跳
            },
            start() { // 开启心跳
                this.timeoutObj && clearTimeout(this.timeout)
                this.timeoutObj = setTimeout(() => {
                    // 发送一个心跳
                    if (this.websock.readyState === 1) { // 连接正常
                        this.wbsock.send('ok')
                    } else { // 重连
                        this.reconnect()
                    }
                }, this.timeout)
            },
            open() {
                console.log('瞎子')
                this.start() // 连接成功 开启心跳
            },
            error(e) {
                this.reconnect() // 重连
            },
            close(e) { // 连接关闭
                this.reconnect() // 重连
            },
            message(smg) { // 向服务端发送数据
                this.websock.send(msg)
            }
        }
    }
</script>




